//
//  JYStatusViewModel.swift
//  01.weibo
//
//  Created by 谢玉锋 on 16/7/15.
//  Copyright © 2016年 itheima.cn. All rights reserved.
//

import UIKit
import SDWebImage

class JYStatusViewModel: NSObject {

    
    static let shareInstance = JYStatusViewModel()
    /// 不要同时出现2个加载微博的请求
    /// 是否在加载微博数据
    private lazy var loadStatusing: Bool = false
    
    //这么做好处是将 init 构造方法写成私有,外面调不了
    //而上面 JYStatusViewModel() 也是调这个方法来的
    private override init() {
        super.init()
    }
    //下载本地数据
    private func loadLocalData() {
        
        let path  = NSBundle.mainBundle().pathForResource("statuses.json", ofType: nil)!
        let data = NSData(contentsOfFile: path)!
        // 函数抛出异常在函数后面有 throws,表示这段有可能会出现异常, 如果我们处理这个异常,程序是不会挂掉的,不处理就会挂掉
        // try!: 强制try, 有异常不处理,如果真的出现异常程序就挂了
        // do try catch: 处理异常,如果出现异常会走catch这个代码块,程序不会挂掉
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data, options: [])
            JYPrint("json: \(json)")
            //这里是固定写法 let error as NSError
        } catch let error as NSError{
        JYPrint("json序列化异常: \(error)")
        }

    }
    //申请微博数据
    func loadStatus(since_id:Int64,max_id:Int64,statusCallBack: (statusModel: [JYStatus]? ,error: NSError?) ->()) {
        //正在加载数据
        if self.loadStatusing == true {
            //返回一个错误
            let error = HMNetworkErrorEnum.RepeatLoadStatus.error()
            statusCallBack(statusModel: nil, error: error)
            return
        }
        // 将加载的状态改成ture,表示有人在加载微博
        self.loadStatusing = true
        
        
            let URLString = "https://api.weibo.com/2/statuses/home_timeline.json"
        //参数 (如果不加类型,xcode会根据右边推断为[String:String]类型)
        var parameters: [String:NSObject] = [
                "access_token" : JYUserAccountViewModel.sharaInstance.userAccount!.access_token!
            ]
        // 将since_id, max_id拼接到请求参数里面
        if since_id > 0{
        parameters["since_id"] = NSNumber(longLong: since_id)
        } else if max_id > 0 {
            parameters["max_id"] = NSNumber(longLong: max_id - 1)
        }
        //调试
//        let bebug = false
//        if bebug {
//        //加载本地数据
//          loadLocalData()
//        }
            JYNetworkTool.shareInstance.GET(URLString, parameters: parameters, progress: nil, success: { (task, responseObject) -> Void in
                //加载完成后要改为 false
                self.loadStatusing = false
                

                //可选绑定
                if let dict = responseObject as? [String: AnyObject], let statusArray = dict["statuses"] as? [[String: AnyObject]]{
                    
                    //statusArr 用来存储微博模型的数组
                    var statusArr: [JYStatus] = []
                    for dict in statusArray{
                    let status = JYStatus(dict: dict)
                        statusArr.append(status)
                    }
                    //缓存图片 (把闭包传递给这个函数)
                    self.cachesImage(statusArr, statusCallBack: statusCallBack)
                    
//                    self.cachesImage(statusArr,statusCallBack: )
                    // 回到控制器,控制器会拿到数据,然后刷新界面
//                    statusCallBack(statusModel: statusArr, error: nil)
                }
                
            }) { (task, error) -> Void in
                
                statusCallBack(statusModel: nil, error: error)
            }
    }
    
    //缓存图片
    private func cachesImage(statusArr: [JYStatus],statusCallBack: (statusModel: [JYStatus]? ,error: NSError?) ->()) {
        //创建任务组
        let group = dispatch_group_create()
        
    //遍历模型数组
        for status in statusArr {
            var downloadURLs: [NSURL]?
            downloadURLs = status.storePicutreURLs
            //判断原创微博是否有图片
            if downloadURLs == nil {
            // 如果原创没有图片要下载,看被转发微博是不是有图片要下载
            downloadURLs = status.retweeted_status?.storePicutreURLs
            }
            // 看看是否有图片要下载
            if let urls = downloadURLs {
                
                if urls.count == 1 {
                    
                    let url = urls.first!
//                for url in urls {
                // 异步任务之前进入组
                dispatch_group_enter(group)
                //下载图片
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [], progress: nil, completed: { (image, error, _, _, _) -> Void in
                    // 异步任务完成会回调这个闭包
                    dispatch_group_leave(group)
                    if error != nil {
                    JYPrint("下载图片出错")
                    return
                    }
                    JYPrint("下载图片完成")
                })
            }
        }
    }
        //监听所有下载图片完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            //跟新UI
            JYPrint("sd下载所有图片完成")
            // 回到控制器,控制器会拿到数据,然后刷新界面
            statusCallBack(statusModel: statusArr, error: nil)
        }
    }
}









